//vuex权限模块
import {constantRoutes, asnycRoutes, errorRoutes} from '@/router'
const state = {
  //最终结果 渲染左侧菜单用
  routes: [],
  addRoutes: [], //计算好的动态路由
  isGetUserInfo: false, //是否获取用户信息 判断token是否正确
}

//计算单个路由是否有权限
/**
 * @param {any} route 单个路由对象
 * @param {string} role 角色
 * @description 计算单个路由是否有权限
 * @returns {boolean}
 */
const hasPermission = (route, role) => {
  //如果当前路由 有roles字段
  if (route.meta?.roles) {
    // ['super','vip']  'super'
    return route.meta.roles.includes(role)
  } else {
    return true
  }
}

//计算动态路由权限函数
const filterAsyncRoutes = (routes, role) => {
  let temp = []
  routes.forEach(route => {
    if (hasPermission(route, role)) {
      //如果有儿子 儿子也需要计算
      if (route.children?.length) {
        route.children = filterAsyncRoutes(route.children, role)
      }
      temp.push(route)
    }
  })

  return temp
}

const mutations = {
  ADD_ROUTES(state, routes) {
    //把静态路由 和 计算好的动态路由 合并给左侧菜单使用
    state.routes = [...constantRoutes, ...routes]
  },
  //设置用户信息状态
  SET_USERINFO_STATE(state, flag) {
    state.isGetUserInfo = flag
  },
}

const actions = {
  //生成动态路由函数
  generateRoutes({commit}, role) {
    return new Promise(resolve => {
      //筛选出可使用的动态路由
      let accessRoutes = filterAsyncRoutes(asnycRoutes, role)

      //把accessRoutes 存进vuex
      commit('ADD_ROUTES', accessRoutes)

      //把筛选好的动态路由 和 错误路由 抛出去 给router.addRoutes用
      resolve([...accessRoutes, ...errorRoutes])
    })
  },
}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
}
